/**
* @file channel_base.h
* @brief 将一条连接抽象成一个channel
* @version 1.0.0
* @date 2016-03-16
*/
#ifndef WH_COMMON_NET_CHANNEL_BASE_H_
#define WH_COMMON_NET_CHANNEL_BASE_H_

#include <string.h>
#include "common_define.h"
#include "ring_streams.h"

namespace common
{
namespace net
{

/**
* @brief channel
*/
class CChannelBase
{
public:

    /**
    * @brief 构造函数
    */
    CChannelBase();

    /**
    * @brief 析构函数
    */
    virtual ~CChannelBase();

    /**
    * @brief 刷新缓冲区
    */
    int32_t Flush();
    /**
    * @brief 获取channel的文件描述符
    *
    * @return 返回channel的socket
    */
    int fd() const
    {
        return fd_;
    }

    /**
    * @brief 设置channle的文件描述符
    *
    * @param fd 文件描述符
    */
    void set_fd(int fd)
    {
        fd_ = fd;
    }

    const char* ip() const
    {
        return ip_;
    }

    void set_ip(const std::string& ip)
    {
        strncpy(ip_, ip.c_str(), sizeof(ip_));
    }

    uint16_t port() const
    {
        return port_;
    }

    void set_port(uint16_t port)
    {
        port_ = port;
    }

    int set_key(int32_t key)
    {
        key_ = key;
        return key_;
    }
    int key()
    {
        return key_;
    }

    int32_t Initialize(uint32_t receive_buffer_capacity, uint32_t send_buffer_capacity);

    int32_t Finalize();

    CRingStreams& receive_buffer()
    {
        return input_streams_;
    }

    CRingStreams& send_buffer()
    {
        return output_streams_;
    }
public:
	// 网络连接事件
	virtual void OnConnect() = 0;
	// 连接断开事件
	virtual void OnDisconnect() = 0;
	// 收到消息事件
	virtual void OnMsgEvent() = 0;

protected:

    int fd_;/**<文件描述符  */

    char ip_[ 24 ];

    uint16_t port_;

    int32_t key_;

    CRingStreams input_streams_;/**<读取逻辑缓存  */

    CRingStreams output_streams_;/**<发送缓存  */
};


}
}

#endif//WH_COMMON_NET_CHANNEL_BASE_H_


